package com.jketing.service.ams.base;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jketing.entity.ams.base.Employee;
import com.jketing.entity.ams.base.Organ;
import com.jketing.repository.BaseRepository;
import com.jketing.repository.ams.base.OrganRepository;
import com.jketing.service.BaseService;


/**
 *  OrganService	功能服务类
 * 	功能：基类实现单表CRUD及分页条件查询，继承扩展实现多表查询及多表操作等（若有需要）；
 * 		可注入其它实体的仓库类或使用jdbc实现Dao调用本地Sql进行多表查询
 * 
 * @author  李荣华
 * @version v1.0
 * @date    2017-11-22
 * @since   Spring-data 1.11.4
 */
@Service
public class OrganService extends BaseService<Organ,String> {
	
	/**
	 * repository String按IOC容器管理的Bean类型自动注入模块仓库操作实例 .
	 */
	@Autowired
	private OrganRepository repository;
	
	/**
	 * String按IOC容器管理的Bean名称自动注入服务基类的仓库操作实例
	 * 	 
	 * @param BaseRepository<Organ,String> repository
	 * 
	 * @return void
	 */
	@Resource(name="organRepository")
	public void setBaseRepository(BaseRepository<Organ,String> repository) {
		super.setBaseRepository(repository);
	}
	
	/**
	 * 新增时调用的save方法
	 * 
	 * 功能:由程序设置PK,不由数据库自动生成
	 * 目的:为实现系统数据库多地部署进行数据同步
	 * 		  PK自增无法完成同步
	 * 
	 * 注:
	 * 	1:因调用实体setId方法，故本方法不能写到基类
	 * 	2:主键是查询数据总条数加1生成和当前时间生成
	 * 	 
	 * @param entity 实例
	 * 
	 * @return Organ 返回save后的实例
	 */
	@Override
	public <S extends Organ> S save(S entity) {
		entity.setId(getTimeId());
		if(entity.getParent()!=null) {
			entity.setGrade(repository.getOne(entity.getParent().getId()).getGrade()+1);
		}else {
			entity.setGrade(1);
		}
		return repository.save(entity);
	}
	
	public Organ update(Organ entity) {
		return repository.saveAndFlush(entity);
	}

	/**
	 * getOrganList 按级别得到机构列表
	 * 
	 * @param grade 树型级别
	 * 
	 * @return List<Organ> 返回机构表
	 */
	public List<Organ> getOrganList(int grade) {
		return repository.getOrganByGrade(grade);
	}
	
	/**
	 * getOrganList 按机构类型得到机构列表
	 * 
	 * @param String type:机构类型
	 * 
	 * @return List<Organ> 返回机构列表
	 */
	public List<Organ> getOrganList(String type) {
		return repository.getOrganByType(type);
	}
	
	/**
	 * getEmployeeList 按机构类型得到机构列表
	 * 
	 * @param String id:PK
	 * 
	 * @return List<Employee> 返回职工列表
	 */
	public List<Employee> getEmployeeList(String id){
		Organ entity = repository.getOne(id);
		List<Employee> result = new ArrayList<Employee>();
		if(entity.getEmployees()!=null){
			Employee obj = null;
			for(Employee item:entity.getEmployees()){
				obj = new Employee();
				obj.setId(item.getId());
				obj.setName(item.getName());
				result.add(obj);
			}	
		}
		return result;
	}

	/**
	 * 得到包含本级和直接下级组织树json数据
	 * 
	 * @param id
	 *            机构id
	 * @return StringBuilder sb 返回行政区域json数据
	 */
	public StringBuilder getTree(String id) {
		StringBuilder sb = new StringBuilder();
		Organ obj = repository.findOne(id);
		sb.append("[");
		sb.append("{\"id\":\"");
		sb.append(obj.getId());
		sb.append("\",\"pId\":\"");
		if (obj.getParent() == null) {
			sb.append(0);
		} else {
			sb.append(obj.getParent().getId());
		}
		sb.append("\",\"name\":\"");
		sb.append(obj.getName());
		sb.append("\",\"isParent\":true");
		sb.append(",\"open\":true");
		sb.append("}");
		for (Organ child : obj.getChildren()) {
			if (sb.length() > 1)
				sb.append(",");
			sb.append("{\"id\":\"");
			sb.append(child.getId());
			sb.append("\",\"pId\":\"");
			sb.append(id);
			sb.append("\",\"name\":\"");
			sb.append(child.getName());
			sb.append("\",\"isParent\":");
			if (child.getChildren().size() > 0) {
				sb.append(true);
			} else {
				sb.append(false);
			}
			sb.append("}");
		}
		sb.append("]");
		return sb;
	}

	/**
	 * 得到本级下的所有行政区域
	 * 
	 * @param id 上级id
	 * @return StringBuilder sb 返回行政区域json数据
	 */
	public StringBuilder getSubTree(String id) {
		StringBuilder sb = new StringBuilder();
		Organ parent = repository.findOne(id);
		sb.append("[");
		for (Organ child : parent.getChildren()) {
			if (sb.length() > 1)
				sb.append(",");
			sb.append("{\"id\":\"");
			sb.append(child.getId());
			sb.append("\",\"pId\":\"");
			sb.append(id);
			sb.append("\",\"name\":\"");
			sb.append(child.getName());
			sb.append("\",\"isParent\":");
			if (child.getChildren().size() > 0) {
				sb.append(true);
			} else {
				sb.append(false);
			}
			sb.append("}");
		}
		sb.append("]");
		return sb;
	}
}
